const joi = require('@hapi/joi')

/** 校验规则
 * string() 值必须是字符串
 * number() 数据必须为数字类型
 * integer() 数据必须为整数类型
 * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
 * min(number|string) number：最小长度 | string：最小日期
 * maxmax(number|string) number：最大长度 | string：最大日期
 * required() 值是必填项，不能为 undefined
 * pattern(正则表达式) 值必须符合正则表达式的规则
 * regex(正则表达式) 定义字段必须匹配正则规则。
 * error(new Error()) 抛出报错
 * label() 备注的信息
 * empty() 允许为空字符串
 * joi.ref(key:string) 引言同辈的键值，就是拿到value
 * not(values:any[]) 当前属性的值不能同参数值相同
 * valid(...values:any[]) 当前属性的值必须于参数值相同
 * dataUri() 当前字段为可以是URL地址
 * allow(...values:any[]) 该字段允许为指定参数的值
 * default(any[]) 设置该字段的默认值，值可以为string、number、boolean……等
 */

// 用户名的验证规则
const username = joi
    .string()
    // .alphanum()
    .min(1)
    .max(10)
    .required()
    .label("用户名")
    .error(new Error("用户名为1-10位任意字符,不能是中文"))
// 密码的验证规则
const password = joi
    .string()
    .pattern(/^[\S]{6,12}$/)
    .required()
    .label("密码")
    .error(new Error("用户密码为6-12位任意字符"))


// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
  // 表示需要对 req.body 中的数据进行验证
  body: {
    username,
    password,
  },
}

// 定义 id, nickname, emial 的验证规则
const id = joi.number()
    .integer()
    .min(1)
    .required()
const nickname = joi
    .string()
    .required()
const email = joi
    .string()
    .email()
    // .required()
// 验证规则对象 - 更新用户基本信息
exports.update_userinfo_schema = {
  body: {
    id,
    nickname,
    email,
  },
}

// 验证规则对象 - 重置密码
exports.update_password_schema = {
  body: {
    // 使用 password 这个规则，验证 req.body.oldPwd 的值
    oldPwd: password,
    // 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则，验证 req.body.newPwd 的值
    // 解读：
    // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
    // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
    // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
    newPwd: joi.not(joi.ref('oldPwd')).concat(password).error(new Error("新密码和旧密码不能一样")),
  },
}

// dataUri() 指的是如下格式的字符串数据：
// 
const avatar = joi.string().dataUri().required().error(new Error("上传错误,请稍后重试!"))
// 验证规则对象 - 更新头像
exports.update_avatar_schema = {
  body: {
    avatar,
  },
}